# 5. 참조타입

# 5.1 데이터 타입 분류

  • 기본타입 : 정수타입(byte, char, short, int, long), 실수타입(float, double), 논리타입(boolean)
  • 참조타입 : 배열타입, 열거타입, 클래스, 인터페이스
  • 기본타입으로 선언된 변수는 값 자체를 저장
  • 참조 타입으로 선언된 변수는 객체가 생성된 메모리 번지를 저장
  • 참조타입인 String 클래스로 선언된 변수는 힙 메모리 영역의 String 객체 번지를 저장하고 이 번지를 통해 String 객체를 참조한다

# 5.2 메모리 사용 영역(메소드, 힙, 스택)

  • java 명령어로 JVM 이 구동되면 JVM은 운영체제에서 할당받은 메모리 영역(Runtime Data Area) 을 다음과 같이 구분해서 사용한다.

    # 메소드 영역

    • 바이트코드 파일을 읽은 내용이 저장되는 영역.
    • 클래스별로 상수, 정적필드, 메소드코드, 생성자 코드 등이 저장된다.

    # 힙 영역

    • 객체가 생성되는 영역.
    • 객체의 번지는 메소드 영역과 스택 영역의 상수와 변수에서 참조할 수 있다.

    # 스택 영역

    • 메소드를 호출할 때 마다 생성되는 프레임(frame)이 저장되는 영역.
    • 메소드 호출이 끝아면 프레임은 자동 제거된다.
    • 프레임 내부에는 로컬변수 스택이 있다. 여기서 기본타입 변수와 참조타입 변수가 생성되고 제거된다.

# 5.3 참조타입 변수의 ==, != 연산

  • 참조 타입 변수의 값은 객체의 번지이므로 참조타입 변수의 ==, != 연산자는 번지를 비교하는 것이 된다.

# 5.4 null과 NullPointerException

  • 참조타입 변수는 아직 번지를 저장하고 있지 않다는 뜻으로 null 값을 가질 수 있다
  • null도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성된다.
  • 변수가 null인 상태에서 객체의 데이터나 메소드를 사용하려 할때 NullPointerException 발생
  • 어떤 변수에서도 객체를 참조하지 않으면 해당 객체는 프로그램에서 사용할 수 없는 객체가 된다. 즉, 힙메모리에는 있지만, 위치 정보를 모르기 때문에 사용할 수 없게 된다.
  • 자바는 이러한 객체를 쓰레기로 취급하고, 쓰레기 수집기(Garbage Collector)를 실행시켜 자동으로 제거한다.
  • 직접 제거하는 방법 제공하지 않음. 객체를 제거하는 유일한 방법은 객체의 모든 참조를 없애는 것 이다.

# 5.5 문자열 타입

# 문자열 비교

String name1 = "홍길동"; // 문자열 리터럴
String name2 = "홍길동";
String name3 = new String("홍길동"); // new 연산자로 String 객체 별도 생성
1
2
3
name1 == name2 // true
name2 == name3 // false
name2.equals(name3) // true

# 문자 추출 : str.charAt(0)

# 문자열 길이 : str.length()

# 문자열 대체 : str.replace("자바","Java")

  • String 객체의 문자열은 변경이 불가한 특성을 갖기 때문에 replace() 메소드가 리턴하는 문자열은 원래 문자열의 수정본이 아니라 완전히 새로운 문자열이다.

# 문자열 잘라내기 : substring(int beginIndex, int endIndex)

# 문자열 찾기 : str.indexOf("프로그래밍")

  • 포함 여부 조사 : str.contains("프로그래밍")

# 문자열 분리 : str.split(",")

# 5.6 배열 타입

# 배열 변수 선언

  • 배열은 같은 타입의 값만 관리한다
  • 배열의 길이는 늘리거나 줄일 수 없다
  • 배열 선언 : 타입[] 변수, 타입 변수[] 둘다 사용 가능하나 관례적으로 첫번째 많이 사용.

# 값 목록으로 배열 생성

{} 중괄호는 나열된 값들을 항목으로 가지는 배열을 힙에 생성하고, 번지를 리턴한다. 배열 변수는 리턴된 번지를 저장함으로써 참조가 이루어진다.

//값 목록으로 배열 생성
타입[] 변수 = {0,1,2,3, ...};

// 컴파일 에러
타입[] 변수;
변수 = {0,1,2,3, ...};

// 변수 선언 시점과 값 목록이 대입되는 시점이 다를때
String[] 변수 = null;
변수 = new 타입[] {0,1,2,3, ...};
1
2
3
4
5
6
7
8
9
10

# new 연산자로 배열 생성

new 연산자로 배열을 생성하면 배열 항목은 기본값으로 초기화된다.

타입[] 변수 = new 타입[길이]

타입[] 변수 = null;
변수 = new 타입[길이];
1
2
3
4

# 배열 길이 : 배열변수.length

# 5.7 다차원 배열

# 값 목록으로 다차원 배열 생성 : 타입[][] 변수 = { {값1, 값2, ...},{값1, 값2, ...} }

# new 연산자로 다차원 배열 생성 : 타입[][] 변수 = new 타입[1차원수][2차원수]

# 5.8 객체를 참조하는 배열

기본타입(byte, char, short, int, long, float, double, boolean) 배열은 각 항목에 값을 직접 저장하지만, 참조타입(클래스, 인터페이스) 배열은 각 항목에 객체의 번지를 저장한다.

# 5.9 배열 복사

  • 배열은 한 번 생성하면 길이를 변경할 수 없다. 더 많은 저장 공간이 필요하다면 더 큰 길이의 배열을 새로 만들고 이전 배열로부터 항목들을 복사해야 한다.
  • 복사방법
    • for문
    • System.arraycopy(원본배열, 원본배열 복사 시작 인덱스, 새배열, 새 배열 붙여넣기 시작 인덱스, 복사항목수)

# 5.10 배열 항목 반복을 위한 향상된 for 문

for( 타입 변수 : 배열) {
    실행문
}

# 5.11 main() 메소드의 String[] 매개변수 용도

  • 이클립스 : Run Configurations > Argument > 10 20 아규먼트 입력
  • 터미널 : java javaprogramname 10 20

# 5.12 열거(Enum) 타입

public enum Week{
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

// 열거타입 Week 변수 선언
Week today;
Week reservationDay;
Week today = Week.SUNDAY;
1
2
3
4
5
6
7
8